﻿// js变量 松散类型，可保存任意类型
var message = "hello";
var age = 10;
var isValid = true;
// 一条语句定义多个变量
var s = "www", qty = 20, failed = false;
// 获取变量类型 typeof 操作符非函数
alert(typeof (message)); //string
alert(typeof (age)); //number
alert(typeof (isValid)); //bool
// Undefined类型
var v1;
alert(typeof (v1) == "undefined"); //true;
var v2 = undefined;
alert(v2 == undefined); //true;
//Null类型
var car = null;
alert(typeof (car)); // object;
//undefined 派生自null
alert(null == undefined); //true;
//Boolean类型,对任何类型调用Boolean()都会返回一个boolean值
var msg = "hello world";
var msgAsBoolean = Boolean(msg);
// Boolean：true返回true，false返回false
// String:任何飞空字符串返回true，""返回false
// Number:任何非零数字值（包括无穷大）返回true，0和NaN返回false
// Object：任何对象返回true，null返回false
// Undefined：n/a返回true，undefined返回false --- n/a或N/A是not applicable的缩写，意思是‘不适用’
//Number类型 永远不要测试某个特定的浮点数值
var a = 0.1, b = 0.2;
alert(a + b == 0.3); //false ,if a=0.05,b=0.25 return true
// 使用isFinite()可以确定一个数值是不是有穷的
//NAN 一个特殊的数值，涉及NAN的操作都会返回NAN；与任何值都不相等，包括NAN本身
alert(NaN == NaN); //false
//isNaN函数，确定一个数值是否“不是数值”
alert(isNaN(NaN)); //true;
alert(isNaN(10)); //false; 10
alert(isNaN('10')); //false; 10
alert(isNaN('blue')); //true;
alert(isNaN(true));//false;  1
// 【数值转换】
//Number()可以用于任何数据类型
var num1 = Number("hello world"); //NAN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true);// 1
//parseInt(),parseFloat()专门用于把字符串转换成数值
var p1 = parseInt("1234blue"); //1234
var p2 = parseInt(""); //NAN
var p3 = parseInt("0xA"); // 10
var p4 = parseInt("22.5"); //22
var p5 = parseInt("070"); //56
var p6 = parseInt("70"); //70
var p7 = parseInt("0xf"); //15

var p8 = parseInt("0xAF", 16); //175
var p9 = parseInt("AF", 16); //175
var p10 = parseInt("AF"); //NAN

var m1 = parseInt("10", 2); //2 二进制
var m2 = parseInt("10", 8); //8 八进制
var m3 = parseInt("10", 10); //10 十进制
var m4 = parseInt("10", 16); //16 十六进制

// parseFloat()十六进制格式的字符串始终被转换为0，只解析10进制值，没有用第二个参数指定基数的用法
var f1 = parseFloat("1234blue"); //1234;
var f2 = parseFloat("0xA"); //0
var f3 = parseFloat("22.5"); //22.5;
var f4 = parseFloat("22.34.5"); //22.34;
var f5 = parseFloat("0908.5"); //908.5;
var f6 = parseFloat("3.125e7"); //31250000;

//String类型，可由单引号或双引号表示
var firstname = "Nile";
var lastname = 'jack';

// \n:换行 \b:空格 \r:回车
var t = 11;
var r = true;
var ts = t.toString(); //"11"
var rs = r.toString(); //"true"

var num = 10;
alert(num.toString()); //'10'
alert(num.toString(2)); //'1010'
alert(num.toString(8)); //'12'
alert(num.toString(10)); //'10'
alert(num.toString(16)); //'a'

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); //"10"
alert(String(value2)); //"true"
alert(String(value3)); //"null"
alert(String(value4)); //"undefined"

//Object类型
var o = new Object();
var o2 = new Object; // 不给构造函数传参可省略后面的括号。有效，但不推荐

//布尔操作符
alert(!false); //true;
alert(!"blue"); //false;
alert(!0); //true;
alert(!NaN); //true;
alert(!""); //true;
alert(!undefined); //true;
alert(!12345); //false;
//逻辑与：短路操作符&&
//+ :如果两个操作数都是字符串，则把它们拼接起来；若只有一个操作数是字符串，则将另一个转为字符串，然后再将它们拼接起来
var result = 5 + 5; // 10
var result2 = "5" + 5; // 55

var s1 = 5;
var s2 = 10;
var ms = 'the sum of 5 and 10 is ' + s1 + s2;
alert(ms); // 'the sum of 5 and 10 is 510';

var ms2 = 'the sum of 5 and 10 is ' + (s1 + s2);
alert(ms2); // 'the sum of 5 and 10 is 15';
//- :
var m1 = 5 - true;  // 4
var m2 = NaN - 1;   // NaN
var m3 = 5 - 3;     // 2
var m4 = 5 - "";    // 5
var m5 = 5 - "2";   // 3
var m6 = 5 - null;  // 5

// '==' '!=' '===' '!=='
var d1 = ('55' == 55); //true;
var d2 = ('55' === 55); //false;
var d3 = ('55' != 55); //false;
var d4 = ('55' !== 55); //true;
var d5 = (undefined == null); //true;
var d6 = (undefined === null); //false;
// 逗号操作符（,）用于声明多个变量，还可用于赋值
var e = (5, 2, 3, 0); // e  = 0;
// for - in 语句：是一种精准的迭代语句，用来枚举对象的属性
for (var p in window) {
    document.write(p);
}
// with语句：将代码的作用域设置到一个特定的对象中。定义with语句的目的主要是为了简化多次编写对同一个对象的工作
// 大量使用with语句会导致性能下降，同时也给调试代码造成困难。开发大型app时不建议使用
var qs = location.search.substring(1);
var hostname = location.hostname;
var url = location.href;
//使用with后
with (location){
    var qs = search.substring(1);
    var hostname = hostname;
    var url = href;
}

//swith语句：可以使用任何数据类型，其次，每个case的值不一定是常量，可以是变量，甚至是表达式
switch ("hello world") {
case "hello"+"world":
    alert("Greeting was found.");
    break;
case "goodbye":
    alert("Closing was found.");
    break;
default:
    alert("Unexpected message was found.");
}

var $qty = 25;
switch (true) {
case $qty < 0:
    alert("Less than 0");
    break;
case $qty > 0 && $qty < 10:
    alert("Between 0 and 10");
    break;
default:
    alert("More than 10");
}

//函数：function

function sayHi(name,msg) {
    alert("hi " + name + ", " + msg);
}

function sayHi() {
    alert("hi " + arguments[0] + ", " + arguments[1]);
}

sayHi("jack", "nice to meet you.");

function howManyArgs() {
    alert(arguments.length);
}

howManyArgs("str", 222); //2
howManyArgs(); //0
howManyArgs("str"); //1








